package in.lib.handler.streams; import in.lib.Debug; import in.lib.adapter.PostAdapter; import in.lib.exception.ExceptionHandler; import in.lib.handler.base.PostStreamResponseHandler; import in.lib.thread.StreamFragmentRunnable; import in.model.Post; import in.model.base.NetObject; import java.util.List; import android.content.Context; import android.view.View; public class MissingPostsResponseHandler extends PostStreamResponseHandler { private final NetObject breakObject; @Override public void onSend() { super.onSend(); Debug.out(getConnectionInfo()); } public MissingPostsResponseHandler(Context c, NetObject obj) { super(c, false); breakObject = obj; } @Override public void onCallback() { if (getFragment() != null) { getFragment().runOnUiThread(responseRunner); } if (getFragment() != null) { getFragment().extractUsersAndTags(getObjects()); } } @Override public void onFailure() { super.onFailure(); if (getFragment() != null) { ((PostAdapter)getFragment().getAdapter()).resetBreak(); ((PostAdapter)getFragment().getAdapter()).notifyDataSetChanged(); } } private StreamFragmentRunnable responseRunner = new StreamFragmentRunnable() { @Override public void run() { if (getFragment() != null) { try { getFragment().getRefreshHelper().finish(); getFragment().getHeadedListView().setBlockLayoutChildren(true); ((PostAdapter)getFragment().getAdapter()).setAnimationsEnabled(false); View v = getFragment().getListView().getChildAt(getFragment().getListView().getChildCount() - 1); int currentPos = getFragment().getListView().getFirstVisiblePosition(); int bottomPos = getFragment().getListView().getLastVisiblePosition(); int top = (v == null) ? 0 : v.getTop(); int breakPos = ((PostAdapter)getFragment().getAdapter()).getBreakPosition(); int pos = bottomPos; if (pos < breakPos) { pos = currentPos; } // our saved pos isnt in the refreshed list. // switch to append and add a break view if (getFragment().getAdapter().getCount() > 0) { // loop through and see if we've loaded past the old stream id boolean allLoaded = false; int index = 0; for (int i = 0; i < getObjects().size(); i++) { Post p = (Post)getObjects().get(i); if (p.equals(getFragment().getAdapter().getItem(getFragment().getAdapter().getBreakPosition() - 1))) { allLoaded = true; break; } index++; } if (!allLoaded && index == getObjects().size()) { index = 0; } List<NetObject> posts = getObjects().subList(index, getObjects().size()); int insertPos = getFragment().getAdapter().indexOf(breakObject); if (insertPos > -1) { getFragment().getAdapter().addItems(insertPos, posts); } if (allLoaded) { ((PostAdapter)getFragment().getAdapter()).setBreakPosition(-2); getFragment().getAdapter().setFirstId(((Post)getFragment().getAdapter().getItem(0)).getOriginalId()); } else { ((PostAdapter)getFragment().getAdapter()).setBreakPosition(insertPos - 1); ((PostAdapter)getFragment().getAdapter()).resetBreak(); } if (insertPos < pos) pos += posts.size(); ((PostAdapter)getFragment().getAdapter()).setLastPositionAnimated(pos + 10); } getFragment().registerPositionReset(pos, top); setFinishedLoading(getAppend()); } catch (Exception e) { ExceptionHandler.sendException(e); e.printStackTrace(); } } super.run(); } }; }